function getRedisSessionId(sid) {
  return `ssid:${sid}`
}

class RedisSessionStore {
  constructor(client) {
    this.client = client
  }
  /**
   * 获取redis中存储的session数据
   * @param {*} sid 
   */
  async get(sid) {
    const id = getRedisSessionId(sid)
    const data = await this.client.get(id)
    if(!data) {
      return null
    }
    
    try {
      const result = JSON.parse(data)
      return result
    } catch(err) {
      return data
    }
  }
  
  /**
   * 存储session数据到redis
   * @param {*} sid 
   * @param {*} sess 
   * @param {*} ttl 保鲜值
   */
  async set(sid, sess, ttl) {
    console.log('set session', sid, sess, ttl)
    const id = getRedisSessionId(sid)
    if (typeof ttl === 'number') {
      ttl = Math.ceil(ttl / 1000)
    }
    let sessVal
    try {
      sessVal = JSON.stringify(sess)
    } catch (err) {
      sessVal = sess
    }
    if(ttl) {
      await this.client.setex(id, ttl, sessVal)
    } else {
      await this.client.set(id, sessVal)
    }
  }

  /**
   * 从redis中删除某个session
   * @param {*} sid 
   */
  async destroy(sid) {
    console.log('destroy session', sid)
    const id = getRedisSessionId(sid) 
    await this.client.del(id)
  }
}

module.exports = RedisSessionStore